package com.answer.service;

import com.answer.entity.App;
import com.answer.model.dto.app.AppQueryRequest;
import com.answer.model.vo.AppVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.servlet.http.HttpServletRequest;

/**
 * 应用服务
 */
public interface AppService extends IService<App> {

    /**
     * 校验数据
     * 此方法的主要目的是为了在创建或更新应用信息前，校验数据的合法性
     * 在添加新数据前进行校验可以防止不合法的数据进入系统，提高系统的稳定性和安全性
     *
     * @param app 应用对象，包含要校验的数据
     * @param add 布尔值，指示是否对创建的数据进行校验 true表示对创建的数据进行校验，false表示对更新的数据进行校验
     */
    void validApp(App app, boolean add);


    /**
     * 获取查询条件
     * 根据AppQueryRequest对象构建查询包装器，以便对App实体进行条件查询
     * 该方法解释了如何根据前端传入的查询参数构建一个动态的查询条件，
     * 从而实现对App数据的灵活查询，如筛选、排序等
     *
     * @param appQueryRequest 查询参数对象，包含前端传入的查询条件
     * @return 返回一个QueryWrapper对象，用于数据库的条件查询操作
     */
    QueryWrapper<App> getQueryWrapper(AppQueryRequest appQueryRequest);

    /**
     * 获取应用封装
     * 此方法的目的是为了创建一个包含应用信息和用户请求信息的对象
     * 它用于统一和简化应用信息的处理和传递
     *
     * @param app 应用程序实体，包含应用的基本信息
     * @return 返回一个AppVO对象，其中包含了应用和请求的相关信息
     */
    AppVO getAppVO(App app);


    /**
     * 分页获取应用封装
     * 该方法的目的是为了实现分页展示应用信息的功能，通过接收一个应用的分页对象和一个HTTP请求对象，
     * 来返回一个封装后应用信息的分页对象。这种设计使得前端可以更方便地分页展示应用列表。
     *
     * @param appPage 应用的分页对象，包含了分页的相关信息以及应用数据
     * @return 返回一个封装后的应用信息分页对象，其中包含了经过封装和处理后的应用数据和分页信息
     */
    Page<AppVO> getAppVOPage(Page<App> appPage);

}
